package asia.lxq.cic.entity;


/**
 * 枚举：处理返回状态码
 * <pre>
 *     以HttpStatus为主架构，原有定义不得乱用。
 *     正常返回代码为200,即HttpStatus.OK.value()
 *
 *     用户自定义错误代码需大于1000
 * </pre>
 *
 * @author MuYi
 * @version 1.0
 * @date 2022/4/2 13:58
 * @see org.springframework.http.HttpStatus
 **/
public enum StatusCode  {
    /**
     * 处理成功
     */
    OK(200, "处理成功"),
    /**
     * 用户输入或请求错误
     */
    REQUEST_ERR(400, "用户输入或请求错误"),
    /**
     * token错误，用户未登录
     */
    FORBIDDEN(403,"禁止访问"),
    /**
     * 系统异常
     */
    SYSTEM_ERR(500, "系统异常"),
    /**
     * 需要身份认证验证
     */
    AUTHENTICATED(401,"需要身份认证验证"),
    ILLEGAL_TOKEN(24161,"非法token"),
    /**
     * 未知异常
     */
    OTHER_ERR(1000, "未知异常");
    private final Integer value;
    private final String  desc;

    StatusCode(Integer value, String desc) {
        this.desc = desc;
        this.value = value;
    }

    public Integer getValue() {
        return this.value;
    }


    public String getDesc() {
        return this.desc;
    }

    /**
     * 将数值或枚举名转换为枚举值
     * <pre>
     *     输入无效返回OTHER_ERR
     * </pre>
     *
     * @param valueOrName 枚举对应的数值value(Integer类型)或枚举项名称name(String类型)
     * @return 枚举值或或OTHER_ERR。
     */
    public static StatusCode parse(Object valueOrName) {
        if (valueOrName == null) return OTHER_ERR;
        if (valueOrName instanceof Integer) {
            for (StatusCode item : StatusCode.values()) {
                if (item.getValue() == valueOrName) return item;
            }
        } else if (valueOrName instanceof String) {
            for (StatusCode item : StatusCode.values()) {
                if (item.name().equals(valueOrName)) return item;
            }
        }
        return OTHER_ERR;
    }

    public boolean isError() {
        return this != OK;
    }
}
